import axios from 'axios'
import config from '@/config/index'

// 简单的日志函数，避免循环依赖
const logRequest = (message) => {
    console.log(message)
    // 在开发环境或调试模式下记录日志
    try {
        // 从配置文件中获取debug状态，而不是从localStorage中获取
        const debug = config.debug
        if (import.meta.env.DEV || debug) {
            const logs = JSON.parse(localStorage.getItem('requestLogs') || '[]')
            logs.push({
                time: new Date().toISOString(),
                content: message,
            })
            // 限制日志数量
            if (logs.length > config.maxLogEntries) {
                logs.shift()
            }
            localStorage.setItem('requestLogs', JSON.stringify(logs))
        }
    } catch (e) {
        console.error('日志记录失败', e)
    }
}

// 创建axios实例
const service = axios.create({
    baseURL: config.baseURL, // 从配置文件中获取baseURL
    timeout: config.apiTimeout, // 从配置文件中获取超时时间
    headers: {
        'Content-Type': 'application/json;charset=utf-8',
    },
})

// 请求拦截器
service.interceptors.request.use(
    (config) => {
        // 在请求发送前可以进行一些处理，例如添加token
        const token = localStorage.getItem('token')
        if (token && config.headers) {
            config.headers['Authorization'] = `Bearer ${token}`
        }

        logRequest(`请求接口: ${config.url}`)
        logRequest(`请求参数: ${JSON.stringify(config.data || config.params)}`)

        return config
    },
    (error) => {
        logRequest(`请求错误: ${error}`)
        return Promise.reject(error)
    },
)

// 响应拦截器
service.interceptors.response.use(
    (response) => {
        const res = response.data

        logRequest(`响应数据: ${JSON.stringify(res)}`)

        // 这里可以根据后端返回的状态码进行不同的处理
        // 成功状态码可能是0或200
        if (res.code !== 0 && res.code !== 200) {
            logRequest(`接口返回错误: ${res.message || '未知错误'}`)

            // 处理特定错误码，例如401未授权
            if (res.code === 401) {
                // 可以在这里处理登出或重新登录的逻辑
            }

            // 处理登录状态错误，code = -2
            if (res.code === -2) {
                logRequest(`登录状态错误，需要重新登录`)
                // 清除本地token
                localStorage.removeItem('token')
                // 跳转到首页，触发重新登录流程
                window.location.href = '/'
                return Promise.reject(new Error('登录状态错误，请重新登录'))
            }

            return Promise.reject(new Error(res.message || '未知错误'))
        } else {
            return res
        }
    },
    (error) => {
        const errMsg =
            error.response && error.response.data ? error.response.data.message : error.message

        logRequest(`响应错误: ${errMsg}`)
        return Promise.reject(error)
    },
)

export default service
